Execution Order
In Unity scripting, there are a number of event functions that get executed in a predetermined order as a script executes. This execution order is described below:
First Scene Load
These functions get called when a scene starts (once for each object in the scene).
- Awake: This function is always called before any Start functions and also just after a prefab is instantiated.
- OnEnable: (only called if the Object is active): This function is called just after the object is enabled.
Before the first frame update
- Start: Start is called before the first frame update only if the script instance is enabled.
Update Order
When you're keeping track of game logic and interactions, animations, camera positions, etc., there are a few different events you can use. The common pattern is to perform most tasks inside the Update() function, but there are also other functions you can use.
- FixedUpdate: FixedUpdate() is often called more frequently than Update(). It can be called multiple times per frame, if the frame rate is low and it may not be called between frames at all if the frame rate is high. All physics calculations and updates occur immediately after FixedUpdate(). When applying movement calculations inside FixedUpdate(), you do not need to multiply your values by Time.deltaTime. This is because FixedUpdate() is called on a reliable timer, independent of the frame rate.
- Update: Update() is called once per frame. It is the main workhorse function for frame updates.
- LateUpdate: LateUpdate() is called once per frame, after Update() has finished. Any calculations that are performed in Update() will have completed when LateUpdate() begins. A common use for LateUpdate() would be a following third-person camera. If you make your character move and turn inside Update(), you can perform all camera movement and rotation calculations in LateUpdate(). This will ensure that the character has moved completely before the camera tracks its position.
Rendering
- OnPreCull: Called before the camera culls the scene. Culling determines which objects are visible to the camera. OnPreCull is called just before culling takes place.
- OnBecameVisible/OnBecameInvisible: Called when an object becomes visible/invisible to any camera.
- OnWillRenderObject: Called once for each camera if the object is visible.
- OnPreRender: Called before the camera starts rendering the scene.
- OnRenderObject: Called after all regular scene rendering is done. You can use GL class or Graphics.DrawMeshNow to draw custom geometry at this point.
- OnPostRender: Called after a camera finishes rendering the scene.
- OnRenderImage(Pro only): Called after scene rendering is complete to allow postprocessing of the screen image.
- OnGUI: Called multiple times per frame in response to GUI events. The Layout and Repaint events are processed first, followed by a Layout and keyboard/mouse event for each input event.
- OnDrawGizmos Used for drawing Gizmos in the scene view for visualisation purposes.
Coroutine
Normal coroutine updates are run after the Update function returns. A coroutine is function that can suspend its execution (yield) until the given given YieldInstruction finishes. Different uses of Coroutines:
- yield; The coroutine will continue after all Update functions have been called on the next frame.
- yield WaitForSeconds(2); Continue after a specified time delay, after all Update functions have been called for the frame
- yield WaitForFixedUpdate(); Continue after all FixedUpdate has been called on all scripts
- yield WWW Continue after a WWW download has completed.
- yield StartCoroutine(MyFunc); Chains the coroutine, and will wait for the MyFunc coroutine to complete first.
When Quitting
These functions get called on all the active objects in your scene, :
- OnApplicationQuit: This function is called on all game objects before the application is quit. In the editor it is called when the user stops playmode. In the web player it is called when the web view is closed.
- OnDisable: This function is called when the behaviour becomes disabled or inactive.
So in conclusion, this is the execution order for any given script:
- All Awake calls
- All Start Calls
- while (stepping towards variable delta time)
- All FixedUpdate functions
- Physics simulation
- OnEnter/Exit/Stay trigger functions
- OnEnter/Exit/Stay collision functions
- Rigidbody interpolation applies transform.position and rotation
- OnMouseDown/OnMouseUp etc. events
- All Update functions
- Animations are advanced, blended and applied to transform
- All LateUpdate functions
- Rendering
Hints
- If you start a coroutine in LateUpdate it will also be called after LateUpdate just before rendering.
- Coroutines are executed after all Update functions.